/********************
 ***   LkType.h   ***
 ********************/

#ifndef         _LN_TYPE_
#define         _LN_TYPE_
#ifdef __cplusplus
extern "C" {
#endif

#include	"Uvec/Vec2d.h"
#include "UGeoApp/GeoApp.h"
#include "Umath/LT2Type.h"


typedef struct ln_type {

	vec2f_type	v;		// len* ( cos(angle) , sin(angle) )
	float	a;		// maximal height of parabola


	// AUX
	float	len;

	vec2f_type	u;			// right normal to v
	float   c_prb;		// 2-nd order coefficient of parabola



	struct ln_type	*p[2];		// F_BEGIN and F_END
} ln_type;





typedef struct pln_type {

	vec2f_type	ctr;

	int	nLk;
	ln_type	*lk;

} pln_type;





#define		LN_ALLOC()	\
			( (ln_type *)malloc( sizeof( ln_type ) ) )


#define		LN_NEXT( link )	( link->p[F_END] )

#define		LN_PREV( link )	( link->p[F_BEGIN] )



ln_type *	ln_alloc( int ino );

void		ln_destroy( ln_type *ln );


ln_type *	ln_create( vec2f_type *p0, vec2f_type *p1, float crbA );

void	ln_set_aux( ln_type *l ) ;

float	ln_length( ln_type *link );

int		ln_no( ln_type *link );



void	ln_t2xy( vec2f_type *vm, ln_type *link, float t, vec2f_type *p );



void	ln_tanget( ln_type *l, float t, vec2f_type *tanget );

void	ln_tanget_beg( ln_type *l, vec2f_type *t );

void	ln_tanget_end( ln_type *l, vec2f_type *t );

void	ln_Ntanget( ln_type *l, float t, vec2f_type *nt );

void	ln_Ntanget_beg( ln_type *l, vec2f_type *t );

void	ln_Ntanget_end( ln_type *l, vec2f_type *t );



int		ln_distance( vec2f_type *ctr, ln_type  *link, ln_type *elink, vec2f_type  *v,
				  ln_type **sl, float *u, float *t, float *gt );

int		ln_distanceG( vec2f_type *ctr, ln_type  *link, ln_type *elink, vec2f_type  *v, float *gt );

void	ln_from_gapp( gapp_type *gapp, vec2f_type *ctr, ln_type **gelm );

int		ln_write_to_file( vec2f_type *ctr, ln_type *gelm, char *file );

int		ln_read_from_file( char *file, vec2f_type *ctr, ln_type **link  );





	// LnTool1.c
ln_type *	lnL_copy( ln_type *plink, ln_type *elink );

void	lnL_end_point( vec2d *ctr, ln_type *link, vec2d *p );

ln_type *	lnL_last( ln_type *link );

void	lnL_connect( ln_type *link, ln_type *nl );


void	lnL_gt2lt( ln_type *link, float gt, ln_type **l0, float *t0 );

int		lnL_copy_sub( vec2d *pctr, ln_type *plink, float gt0, float gt1, vec2d *ctr, ln_type **link  );

ln_type *	lnL_inverse( ln_type *link );

void	ln_inverse( ln_type *l );


void	lnL_lt2( vec2d *ctr, ln_type *link, lt2_type *lt );



	// LnSplt.c
ln_type *	ln_split( ln_type *link, float t, float dt );

ln_type *	ln_split_t( ln_type *link, float t0 );




#ifdef __cplusplus
}
#endif
#endif
